/*
 * CredentialRequestDialog.java
 *
 * Created on 04 January 2006, 10:38
 */

package org.owasp.webscarab.ui.swing;

import org.owasp.webscarab.plugin.BasicCredential;
import org.owasp.webscarab.plugin.CredentialManager;
import org.owasp.webscarab.plugin.CredentialManagerUI;
import org.owasp.webscarab.plugin.DomainCredential;

/**
 *
 * @author  rdawes
 */
public class CredentialRequestDialog extends javax.swing.JDialog implements CredentialManagerUI {
    
    /**
	 * 
	 */
	private static final long serialVersionUID = 2733259794943234695L;
	private CredentialManager _manager;
    
    /** Creates new form CredentialRequestDialog */
    public CredentialRequestDialog(java.awt.Frame parent, boolean modal, CredentialManager manager) {
        super(parent, modal);
        initComponents();
        getRootPane().setDefaultButton(okButton);
        _manager = manager;
    }
    
    public void requestCredentials(final String host, final String[] challenges) {
        setup(host, challenges);
        getOwner().setVisible(true);
        setVisible(true);
        toFront();
    }
    
    private void setup(String host, String[] challenges) {
        basicRadioButton.setEnabled(false);
        domainRadioButton.setEnabled(false);
        hostTextField.setText("");
        domainTextField.setText("");
        realmTextArea.setText("");
        usernameTextField.setText("");
        passwordTextField.setText("");
        
        if (host != null) 
            hostTextField.setText(host);
        if (challenges == null) {
            basicRadioButton.setEnabled(true);
            realmTextArea.setEditable(true);
            domainRadioButton.setEnabled(true);
        } else {
            for (int i=0; i<challenges.length; i++) {
                if (challenges[i].startsWith("Basic ")) {
                    basicRadioButton.setEnabled(true);
                    String realm = challenges[i].substring("Basic realm=\"".length(), challenges[i].length()-1);
                    realmTextArea.setText(realm);
                    realmTextArea.setEditable(false);
                } else if (challenges[i].startsWith("NTLM") || challenges[i].startsWith("Negotiate")) {
                    domainRadioButton.setEnabled(true);
                }
            }
        }
        if (basicRadioButton.isEnabled()) {
            basicRadioButton.doClick();
        } else if (domainRadioButton.isEnabled()) {
            domainRadioButton.doClick();
        }
    }
    
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
    private void initComponents() {
        java.awt.GridBagConstraints gridBagConstraints;

        methodButtonGroup = new javax.swing.ButtonGroup();
        jPanel1 = new javax.swing.JPanel();
        basicRadioButton = new javax.swing.JRadioButton();
        domainRadioButton = new javax.swing.JRadioButton();
        hostLabel = new javax.swing.JLabel();
        hostTextField = new javax.swing.JTextField();
        domainLabel = new javax.swing.JLabel();
        domainTextField = new javax.swing.JTextField();
        realmLabel = new javax.swing.JLabel();
        realmTextArea = new javax.swing.JTextArea();
        usernameLabel = new javax.swing.JLabel();
        usernameTextField = new javax.swing.JTextField();
        passwordLabel = new javax.swing.JLabel();
        passwordTextField = new javax.swing.JPasswordField();
        jPanel2 = new javax.swing.JPanel();
        cancelButton = new javax.swing.JButton();
        okButton = new javax.swing.JButton();

        getContentPane().setLayout(new java.awt.GridBagLayout());

        setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);
        setTitle("Enter your credentials to access this web site");
        setResizable(false);
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosed(java.awt.event.WindowEvent evt) {
                formWindowClosed(evt);
            }
        });

        methodButtonGroup.add(basicRadioButton);
        basicRadioButton.setSelected(true);
        basicRadioButton.setText("Basic");
        basicRadioButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                basicRadioButtonActionPerformed(evt);
            }
        });

        jPanel1.add(basicRadioButton);

        methodButtonGroup.add(domainRadioButton);
        domainRadioButton.setText("Domain");
        domainRadioButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                domainRadioButtonActionPerformed(evt);
            }
        });

        jPanel1.add(domainRadioButton);

        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridwidth = 2;
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        getContentPane().add(jPanel1, gridBagConstraints);

        hostLabel.setText("Host");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 1;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
        gridBagConstraints.insets = new java.awt.Insets(0, 5, 0, 5);
        getContentPane().add(hostLabel, gridBagConstraints);

        hostTextField.setMinimumSize(new java.awt.Dimension(200, 22));
        hostTextField.setPreferredSize(new java.awt.Dimension(200, 22));
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 1;
        gridBagConstraints.gridy = 1;
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        gridBagConstraints.weightx = 1.0;
        getContentPane().add(hostTextField, gridBagConstraints);

        domainLabel.setText("Domain");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 2;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
        gridBagConstraints.insets = new java.awt.Insets(0, 5, 0, 5);
        getContentPane().add(domainLabel, gridBagConstraints);

        domainTextField.setMinimumSize(new java.awt.Dimension(200, 22));
        domainTextField.setPreferredSize(new java.awt.Dimension(200, 22));
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 1;
        gridBagConstraints.gridy = 2;
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        gridBagConstraints.weightx = 1.0;
        getContentPane().add(domainTextField, gridBagConstraints);

        realmLabel.setText("Realm");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 3;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST;
        gridBagConstraints.insets = new java.awt.Insets(0, 5, 0, 5);
        getContentPane().add(realmLabel, gridBagConstraints);

        realmTextArea.setEditable(false);
        realmTextArea.setMinimumSize(new java.awt.Dimension(200, 22));
        realmTextArea.setPreferredSize(new java.awt.Dimension(200, 22));
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 1;
        gridBagConstraints.gridy = 3;
        gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
        gridBagConstraints.weightx = 1.0;
        gridBagConstraints.weighty = 1.0;
        getContentPane().add(realmTextArea, gridBagConstraints);

        usernameLabel.setText("Username");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 4;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
        gridBagConstraints.insets = new java.awt.Insets(0, 5, 0, 5);
        getContentPane().add(usernameLabel, gridBagConstraints);

        usernameTextField.setMinimumSize(new java.awt.Dimension(200, 22));
        usernameTextField.setPreferredSize(new java.awt.Dimension(200, 22));
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 1;
        gridBagConstraints.gridy = 4;
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        gridBagConstraints.weightx = 1.0;
        getContentPane().add(usernameTextField, gridBagConstraints);

        passwordLabel.setText("Password");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 5;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
        gridBagConstraints.insets = new java.awt.Insets(0, 5, 0, 5);
        getContentPane().add(passwordLabel, gridBagConstraints);

        passwordTextField.setMinimumSize(new java.awt.Dimension(200, 22));
        passwordTextField.setPreferredSize(new java.awt.Dimension(200, 22));
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 1;
        gridBagConstraints.gridy = 5;
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        gridBagConstraints.weightx = 1.0;
        getContentPane().add(passwordTextField, gridBagConstraints);

        cancelButton.setText("Cancel");
        cancelButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cancelButtonActionPerformed(evt);
            }
        });

        jPanel2.add(cancelButton);

        okButton.setText("Ok");
        okButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                okButtonActionPerformed(evt);
            }
        });

        jPanel2.add(okButton);

        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 6;
        gridBagConstraints.gridwidth = 2;
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        getContentPane().add(jPanel2, gridBagConstraints);

        java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
        setBounds((screenSize.width-419)/2, (screenSize.height-206)/2, 419, 206);
    }// </editor-fold>//GEN-END:initComponents

    private void domainRadioButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_domainRadioButtonActionPerformed
        domainLabel.setVisible(true);
        domainTextField.setVisible(true);
        realmLabel.setVisible(false);
        realmTextArea.setVisible(false);
    }//GEN-LAST:event_domainRadioButtonActionPerformed

    private void basicRadioButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_basicRadioButtonActionPerformed
        domainLabel.setVisible(false);
        domainTextField.setVisible(false);
        realmLabel.setVisible(true);
        realmTextArea.setVisible(true);
    }//GEN-LAST:event_basicRadioButtonActionPerformed

    private void okButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okButtonActionPerformed
        ok();
    }//GEN-LAST:event_okButtonActionPerformed

    private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelButtonActionPerformed
        cancel();
    }//GEN-LAST:event_cancelButtonActionPerformed

    private void formWindowClosed(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosed
        cancel();
    }//GEN-LAST:event_formWindowClosed
    
    private void ok() {
        String host = hostTextField.getText();
        String domain = domainTextField.getText();
        String realm = realmTextArea.getText();
        String username = usernameTextField.getText();
        String password = new String(passwordTextField.getPassword());
        if (!(username.equals("") || password.equals(""))) {
            if (basicRadioButton.isSelected()) {
                BasicCredential bc = new BasicCredential(host, realm, username, password);
                _manager.addBasicCredentials(bc);
            } else if (domainRadioButton.isSelected()) {
                DomainCredential dc = new DomainCredential(host, domain, username, password);
                _manager.addDomainCredentials(dc);
            }
        }
        setVisible(false);
    }
    
    private void cancel() {
        setVisible(false);
    }
    
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JRadioButton basicRadioButton;
    private javax.swing.JButton cancelButton;
    private javax.swing.JLabel domainLabel;
    private javax.swing.JRadioButton domainRadioButton;
    private javax.swing.JTextField domainTextField;
    private javax.swing.JLabel hostLabel;
    private javax.swing.JTextField hostTextField;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.ButtonGroup methodButtonGroup;
    private javax.swing.JButton okButton;
    private javax.swing.JLabel passwordLabel;
    private javax.swing.JPasswordField passwordTextField;
    private javax.swing.JLabel realmLabel;
    private javax.swing.JTextArea realmTextArea;
    private javax.swing.JLabel usernameLabel;
    private javax.swing.JTextField usernameTextField;
    // End of variables declaration//GEN-END:variables
    
}
